home *** CD-ROM | disk | FTP | other *** search
/ PC Media 23 / PC MEDIA CD23.iso / share / prog / pcl4w12 / simple.c < prev    next >
Text File  |  1995-08-07  |  8KB  |  327 lines

  1. /*
  2. **                    --- simple.c ---
  3. **
  4. **  EXAMPLE CODE: Very simple terminal emulator.
  5. **
  6. **  This example program (not the PCL4W library) is donated to
  7. **  the Public Domain by MarshallSoft Computing, Inc. It is
  8. **  provided as an example of the use of the PCL4W.
  9. **
  10. */
  11.  
  12. #include "windows.h"
  13. #include "stdio.h"
  14. #include "simple.h"
  15. #include "pcl4w.h"
  16. #include "sioerror.h"
  17. #include "ascii.h"
  18. #include "simpl_io.h"
  19. #include "expect.h"
  20. #include "config.h"
  21. #include "paint.h"
  22. #include "line.h"
  23. #include "about.h"
  24.  
  25. /* public globals */
  26. HWND hMainWnd;            /* main window handle */
  27. HWND hInfoWnd;            /* popup handle */
  28. HANDLE hInstance;         /* program instance */
  29. int OnLineFlag = FALSE;   /* TRUE: online */
  30. int FatalFlag = FALSE;    /* TRUE: fatal error */
  31.  
  32. /* private globals */
  33. static int WinWidth = 8 * NCOLS;
  34. static int WinHeight = 12 * NROWS + 48;
  35.  
  36. /* miscellaneous functions */
  37. void ErrorCheck(int);
  38.  
  39. /*
  40. ** PostMainHandle() is required only for the
  41. ** Shareware version of PCL4W.
  42. */
  43.  
  44. #if __cplusplus
  45. extern "C" void FAR PASCAL PostMainHandle(HWND);
  46. #else
  47. extern void FAR PASCAL PostMainHandle(HWND);
  48. #endif
  49.  
  50. int PASCAL WinMain(HANDLE hInst,HANDLE hPrevInstance,
  51.                    LPSTR lpCmdLine,int nCmdShow)
  52. {WNDCLASS  wc;
  53.  MSG msg;
  54.  BOOL Result;
  55.  if(!hPrevInstance)
  56.    {/* register main window class */
  57.     wc.style = CS_HREDRAW | CS_VREDRAW;
  58.     wc.lpfnWndProc = MainWndProc;
  59.     wc.cbClsExtra = 0;
  60.     wc.cbWndExtra = 0;
  61.     wc.hInstance = hInst;
  62.     wc.hIcon = LoadIcon(hInst, "SimpleIcon");
  63.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  64.     wc.hbrBackground = GetStockObject(WHITE_BRUSH);
  65.     wc.lpszMenuName =  "SimpleMenu";
  66.     wc.lpszClassName = "SimpleWClass";
  67.     Result = RegisterClass(&wc);
  68.     if(!Result) return FALSE;
  69.    }
  70.  
  71.  /* create main window */
  72.  hInstance = hInst;
  73.  hMainWnd = CreateWindow(
  74.         "SimpleWClass",   "Simple",       WS_OVERLAPPEDWINDOW,
  75.         CW_USEDEFAULT,    CW_USEDEFAULT,
  76.         WinWidth,         WinHeight,
  77.         NULL,             NULL,
  78.         hInstance,        NULL);
  79.  ShowWindow(hMainWnd, nCmdShow);
  80.  UpdateWindow(hMainWnd);
  81.  
  82.  /* window control loop */
  83.  
  84.  while(GetMessage(&msg,NULL,NULL,NULL))
  85.    {
  86.     TranslateMessage(&msg);
  87.     DispatchMessage(&msg);
  88.    }
  89.  return (msg.wParam);
  90. } /* end WinMain */
  91.  
  92. long FAR PASCAL MainWndProc(HWND hWindow,UINT message,WPARAM wParam,LPARAM lParam)
  93. {
  94.  UINT idTimer;
  95.  HDC hDC;
  96.  PAINTSTRUCT ps;
  97.  int i;
  98.  int TheChar;
  99.  char Temp[82];
  100.  HMENU hMenu;
  101.  int Count;
  102.  static FARPROC lpProcAbout;
  103.  static int ThePort;
  104.  
  105.  hMainWnd = hWindow;
  106.  switch (message)
  107.     {
  108.      case WM_COMMAND:
  109.          switch(wParam)
  110.            {case MSG_ABOUT:
  111.               DialogBox(hInstance,"AboutBox",hMainWnd,lpProcAbout);
  112.               break;
  113.  
  114.             case MSG_LOAD:
  115.               if(!ExpectOffLine()) break;
  116.               LoadConfig();
  117.               break;
  118.  
  119.             case MSG_SAVE:
  120.               if(!ExpectOffLine()) break;
  121.               SaveConfig();
  122.               SetTitle();
  123.               break;
  124.  
  125.             case MSG_DEBUG:
  126.               /*
  127.               sprintf(Temp,"Debug = %x",SioDebug(0));
  128.               DisplayLine(Temp);
  129.               */
  130.               for(i=0;i<7;i++)
  131.                 {sprintf(Temp,"UART%d = %x", i, SioRead(0,i) );
  132.                  DisplayLine(Temp);
  133.                 }
  134.               break;
  135.  
  136.             case MSG_ONLINE:
  137.               if(!ExpectOffLine()) break;
  138.               if(FatalFlag) ErrorMessage("Fatal Error");
  139.               else
  140.                 {/* try to go on-line */
  141.                  GoOnLine();
  142.                  if(!OnLineFlag) break;
  143.                  ThePort = GetPort();
  144.                 }
  145.               break;
  146.  
  147.             case MSG_OFFLINE:
  148.               GoOffLine();
  149.               break;
  150.  
  151.             case MSG_EXIT:
  152.               GoOffLine();
  153.               KillTimer(hMainWnd,idTimer);
  154.               PostQuitMessage(0);
  155.               break;
  156.  
  157.             case MSG_1200:
  158.               SetBaud(Baud1200);
  159.               break;
  160.  
  161.             case MSG_2400:
  162.               SetBaud(Baud2400);
  163.               break;
  164.  
  165.             case MSG_4800:
  166.               SetBaud(Baud4800);
  167.               break;
  168.  
  169.             case MSG_9600:
  170.               SetBaud(Baud9600);
  171.               break;
  172.  
  173.             case MSG_19200:
  174.               SetBaud(Baud19200);
  175.               break;
  176.  
  177.             case MSG_38400:
  178.               SetBaud(Baud38400);
  179.               break;
  180.  
  181.             case MSG_57600:
  182.               SetBaud(Baud57600);
  183.               break;
  184.  
  185.             case MSG_115200:
  186.               SetBaud(Baud115200);
  187.               break;
  188.  
  189.             case MSG_COM1:
  190.               SetPort(COM1);
  191.               break;
  192.  
  193.             case MSG_COM2:
  194.               SetPort(COM2);
  195.               break;
  196.  
  197.             case MSG_COM3:
  198.               SetPort(COM3);
  199.               break;
  200.  
  201.             case MSG_COM4:
  202.               SetPort(COM4);
  203.               break;
  204.  
  205.             case MSG_NONE:
  206.               SetParity(NoParity);
  207.               break;
  208.  
  209.             case MSG_EVEN:
  210.               SetParity(EvenParity);
  211.               break;
  212.  
  213.             case MSG_ODD:
  214.               SetParity(OddParity);
  215.               break;
  216.  
  217.             case MSG_1_SB:
  218.               SetStopBits(OneStopBit);
  219.               break;
  220.  
  221.             case MSG_2_SB:
  222.               SetStopBits(TwoStopBits);
  223.               break;
  224.  
  225.             case MSG_7_DB:
  226.               SetWordLength(WordLength7);
  227.               break;
  228.  
  229.             case MSG_8_DB:
  230.               SetWordLength(WordLength8);
  231.               break;
  232.  
  233.             default:
  234.               return (DefWindowProc(hMainWnd, message, wParam, lParam));
  235.            }
  236.          break;
  237.  
  238.     case WM_CREATE:
  239.  
  240. /*
  241. ** You must call PostMainHandle() before attemping to go online.
  242. ** This is required only for the Shareware version of PCL4W.
  243. */
  244.       PostMainHandle(hMainWnd);
  245.  
  246.       /* check "OFFLINE" menu item */
  247.       hMenu = GetMenu(hMainWnd);
  248.       CheckMenuItem(hMenu,MSG_OFFLINE,MF_BYCOMMAND | MF_CHECKED);
  249.       /* create AboutDlgProc() thunk */
  250.       lpProcAbout = MakeProcInstance(AboutDlgProc, hInstance);
  251.       /* init configuration */
  252.       InitConfig();
  253.       LoadConfig();
  254.       /* initialize paint module */
  255.       InitPaint();
  256.       /* start timer */
  257.       idTimer = SetTimer(hMainWnd,1,125,NULL);
  258.       if(idTimer==0)
  259.          {ErrorMessage("No timers remaining !");
  260.           FatalFlag = TRUE;
  261.          }
  262.       break;
  263.  
  264.     case WM_CHAR:
  265.       PutChar(ThePort, (char)wParam );
  266.       break;
  267.  
  268.     case WM_TIMER:
  269.       /* fatal error ? */
  270.       if(FatalFlag) break;
  271.       if(!OnLineFlag) break;
  272.       /* fetch line of up to 82 chars */
  273.       Count = 0;
  274.       for(i=0;i<82;i++)
  275.         {TheChar = GetChar(ThePort);
  276.          /* character available ? */
  277.          if(TheChar==-1) break;
  278.          Temp[Count++] = TheChar;
  279.          if((char)TheChar==(char)LF) break;
  280.         } /* end while */
  281.       if(Count>0) WriteTheString(Temp,Count);
  282.       break;
  283.  
  284.     case WM_SETFOCUS:
  285.       /* create client area caret */
  286.       CreateCaret(hMainWnd,NULL,3,10);
  287.       SetCaretPos(GetXposition(),GetYposition());
  288.       ShowCaret(hMainWnd);
  289.       ShowCaret(hMainWnd);
  290.       break;
  291.  
  292.     case WM_KILLFOCUS:
  293.       DestroyCaret();
  294.       break;
  295.  
  296.     case WM_PAINT:
  297.       HideCaret(hMainWnd);
  298.       hDC = BeginPaint(hMainWnd, &ps);
  299.       SetMapMode(hDC,MM_ANISOTROPIC);
  300.       SelectObject(hDC, GetStockObject(OEM_FIXED_FONT) );
  301.       PaintMain(hDC,&ps);
  302.       EndPaint(hMainWnd,&ps);
  303.       SetCaretPos(GetXposition(),GetYposition());
  304.       ShowCaret(hMainWnd);
  305.       break;
  306.  
  307.     case WM_DESTROY:
  308.       GoOffLine();
  309.       if(idTimer) KillTimer(hMainWnd,idTimer);
  310.       PostQuitMessage(0);
  311.       break;
  312.  
  313.     default:
  314.       return (DefWindowProc(hMainWnd, message, wParam, lParam));
  315.    }
  316.  return (NULL);
  317. } /* end MainWndProc */
  318.  
  319. void ErrorCheck(int Code)
  320. {/* trap PCL error codes */
  321.  if(Code<0)
  322.      {SioError(Code,"Sio Error");
  323.       SioDone(GetPort());
  324.       FatalFlag = TRUE;
  325.      }
  326. } /* end ErrorCheck */
  327.